home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_300 / 352_01 / argscan.cpp < prev    next >
C/C++ Source or Header  |  1991-04-23  |  2KB  |  87 lines

  1. // ARGSCAN.CPP
  2. //        unified approach to command-line parms.
  3. //        ARGTBL: NULL-terminated list of strings to match and addresses of data
  4. //                                also max length of string (incl term. 0)
  5. //                                if len==1, data is treated like single char.
  6. //                                if len==0, data value is converted to int.
  7. //        argscan () - interpret argc/argv according to argtbl
  8. //                RETURNS:  number of unmatched args.
  9. //                MODIFIES: argv points to list of unmatched args, terminated by 0
  10. //                    (array of ptrs to strings, with NULL terminator.)
  11. //                    return value of 0 means all args were matched.
  12. //                NOTE that argv[0] was program name, becomes 1st unmatched arg.
  13. //                
  14. //        example entries: invoke program.exe  -A- -c23 name=GEORGE 
  15. //                    char name[10], switchA='+', int count=1;  ...defaults
  16. //                    ARGTBL args[]= {"name=",name, sizeof(name),
  17. //                                    "-A",   switchA, sizeof(switchA),
  18. //                                    "-C",   count, 0 }; 
  19. //        NOTE: uses case-insenstive match.
  20. //        
  21. #include "dblib.h"
  22.  
  23. int argscan ( int argc, char **argv, ARGTBL *argtbl )
  24.     {
  25.     int remaining = 0;
  26.     int len;
  27.         
  28.     for ( int n=1; n<argc; ++n )        // process args, skip prog name.
  29.         {
  30.         for ( ARGTBL *eptr=argtbl; (eptr->arg_id) != NULL; ++eptr )
  31.             {
  32.             ARGTBL entry = *eptr;            // working copy. 
  33.             len = strlen ( entry.arg_id );
  34.             if ( memicmp ( entry.arg_id, argv[n], len )==0 )
  35.                 {
  36.                 // match to table
  37.                 if (entry.arg_len == 0) 
  38.                     *((int*)entry.arg_ptr) = atoi ( argv[n] + len );
  39.                 else
  40.                 if (entry.arg_len == 1) 
  41.                     *( (char*) (entry.arg_ptr) ) = argv[n][len];
  42.                 else
  43.                     {
  44.                     memcpy ( entry.arg_ptr, argv[n]+len, entry.arg_len );
  45.                     *(  (char*) (entry.arg_ptr) + entry.arg_len -1)=0;
  46.                     }
  47.                 break;    // break from if...
  48.                 }        // end if ... match
  49.             }
  50.             
  51.         if  (eptr->arg_id == NULL ) // NON-MATCH
  52.             {
  53.             argv[remaining] = argv[n];
  54.             ++remaining;
  55.             }        
  56.         }     
  57.     argv[remaining] = NULL;
  58.     
  59.     return ( remaining );        // argscan()
  60.     }
  61. //----------------- end of argscan ----------------------
  62.  
  63. #ifdef ARGSCAN
  64. char S[10] ="DEFAULT", C ='D';
  65. int  I = 0;
  66.  
  67. ARGTBL argtbl[] = 
  68.     {
  69.     {"S=", &S, sizeof (S) },
  70.     {"I=", &I, 0 },
  71.     {"C=", &C, 1 },
  72.     {NULL, NULL, 0 }
  73.     };
  74.  
  75.  
  76. main ( int argc, char **argv )
  77.     {
  78.     argc =argscan ( argc, argv, argtbl );
  79.     printf ( "S=%s, C=%c, I=%i. Remaining =%i\n", S, C, I, argc );
  80.     while ( *argv )
  81.         {
  82.         puts ( *(argv++) );
  83.         }
  84.     return (0);    
  85.     }
  86. #endif        // ARGSCAN    
  87.